#pragma once
#include <google/protobuf/service.h>
#include <memory>
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
#include <unordered_map>

// 提供rpc服务的网络服务对象
class RpcProvider
{
public:
    // 框架提供给外部使用的可以发布rpc方法，所以要做到"通用"
    // 即参数要是Service基类，这样就可以接受任意子类的指针

    // 两层继承关系
    /**
     * ::fixbug::UserServiceRpc 继承于 ::google::protobuf::Service
     * UserService 继承于 ::fixbug::UserServiceRpc
     * 所以UserService也是Service的子类
     */
    void NotifyService(::google::protobuf::Service *service);

    // 启动rpc服务节点，开始提供rpc远程网络调用服务
    void Run();

private:
    void OnConnection(const muduo::net::TcpConnectionPtr &conn);
    void OnMessage(const muduo::net::TcpConnectionPtr &conn,
                   muduo::net::Buffer *buf,
                   muduo::Timestamp time);

    // Closure回调方法，负责response的序列化和发送
    void SendRpcResponse(const muduo::net::TcpConnectionPtr &conn, google::protobuf::Message *response);
    muduo::net::EventLoop m_eventloop;

    // Service服务类型信息
    struct ServiceInfo
    {
        google::protobuf::Service *m_service;
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor *> m_methodMap; // <服务方法名称，方法描述>
    };

    // 存储注册成功的服务对象和其服务方法的所有信息
    std::unordered_map<std::string, ServiceInfo> m_serviceMap;
};